/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-11-21 23:24:56
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-11-22 22:32:32
 * @FilePath: /linux34/Thread.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once
#include <iostream>
#include <string>
#include <functional>
#include <pthread.h>

namespace ThreadMoudle
{
    // 线程要执行的方法，后面我们随时调整
    // typedef void (*func_t)(ThreadData *td); // 函数指针类型

    // typedef std::function<void()> func_t;
    using func_t = std::function<void(const std::string&)>;
    class Thread

    {
    public:
        void Excute()
        {
            _isrunning = true;
            _func(_name);
            _isrunning = false;
        }
    public:
        Thread(const std::string &name, func_t func):_name(name), _func(func)
        {
        }
        static void *ThreadRoutine(void *args) // 新线程都会执行该方法！
        {
            Thread *self = static_cast<Thread*>(args); // 获得了当前对象
            self->Excute();
            return nullptr;
        }
        bool Start()
        {
            int n = ::pthread_create(&_tid, nullptr, ThreadRoutine, this);
            if(n != 0) return false;
            return true;
        }
        std::string Status()
        {
            if(_isrunning) return "running";
            else return "sleep";
        }
        void Stop()
        {
            if(_isrunning)
            {
                ::pthread_cancel(_tid);
                _isrunning = false;
            }
        }
        void Join()
        {
            ::pthread_join(_tid, nullptr);
        }
        std::string Name()
        {
            return _name;
        }
        ~Thread()
        {
        }

    private:
        std::string _name;
        pthread_t _tid;
        bool _isrunning;
        func_t _func; // 线程要执行的回调函数
    };
} // namespace ThreadModle


// 这段代码定义了一个 C++ 的 Thread 类，它封装了 POSIX 线程（pthread）相关的功能，使用了 std::function 类型的回调函数来执行线程任务。该类支持启动、停止、检查状态、连接线程等基本的线程操作。
// func_t 类型定义
// using func_t = std::function<void(const std::string&)>;
// func_t 是一个类型别名，代表了一个接受 std::string 类型参数并返回 void 的函数类型。std::function 是一个非常灵活的 C++ 标准库模板，它可以存储任何可以匹配给定签名的函数、函数指针、成员函数指针、或者 Lambda 表达式。在这里，func_t 表示线程要执行的回调函数，这些函数接受一个 std::string 参数。
// Thread 类的成员变量和构造函数
// _name：保存线程的名称，这是一个 std::string 类型的变量。
// _tid：类型为 pthread_t，用于标识线程的 ID。这个值由 pthread_create 创建时生成。
// _isrunning：一个布尔值，表示线程是否正在运行。
// _func：一个 func_t 类型的函数对象，表示线程启动后执行的任务。
// 构造函数接受线程名称和一个回调函数（func_t 类型），并将它们初始化给对应的成员变量。_isrunning 初始值为 false。
// Excute 方法
// Excute 方法是线程执行的主要操作。当线程启动时，这个方法会被调用。它的功能是：
// 将 _isrunning 设置为 true，表示线程正在运行。
// 调用回调函数 _func，并传递线程的名称 _name。
// 最后将 _isrunning 设置为 false，表示线程执行完毕。
// ThreadRoutine 静态方法
// ThreadRoutine 是一个静态函数，是每个线程创建时要执行的函数。pthread_create 会将一个 void* 类型的参数传递给线程的执行函数，在这里我们传递了当前 Thread 对象的指针。为了方便使用，我们通过 static_cast<Thread*>(args) 将 args 转换为 Thread* 类型，然后调用线程对象的 Excute 方法来执行线程任务。
// Start 方法
// Start 方法用于启动线程。它通过调用 pthread_create 来创建一个新线程：
// _tid：保存新创建线程的 ID。
// nullptr：该参数可以用来设置线程属性，传入 nullptr 表示使用默认属性。
// ThreadRoutine：线程的执行入口函数，即上面提到的静态函数。
// this：将当前 Thread 对象的指针作为参数传递给 ThreadRoutine。
// 如果线程创建失败，pthread_create 会返回非零值，因此返回 false 表示创建失败。否则，返回 true
// Status 方法
// Status 方法检查线程是否正在运行，并返回当前状态：
// 如果 _isrunning 为 true，返回 "running"。
// 否则，返回 "sleep"，表示线程没有在运行。
// Stop 方法
// Stop 方法用于停止线程。如果线程正在运行（即 _isrunning 为 true），它通过调用 pthread_cancel 来请求取消线程的执行，并将 _isrunning 设置为 false。需要注意，pthread_cancel 只是发送一个取消请求，线程的具体取消机制和时机依赖于线程的实现。
// Join 方法
// Join 方法用来等待线程执行完毕。pthread_join 会阻塞当前线程，直到指定的线程执行完毕。传入的 _tid 是目标线程的 ID。
// Name 方法
// Name 方法返回线程的名称（_name）。
// 析构函数
// 析构函数为空，表明该类没有显式的资源释放要求，pthread_t 会在程序结束时自动清理。如果有需要释放的资源，可以在此添加清理代码。